home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / cdevskel.cpt / CdevSkeleton2.0 ƒ / DialogUtils.p < prev    next >
Encoding:
Text File  |  1991-08-21  |  15.8 KB  |  719 lines

  1. {    DialogUtils.p}
  2. {    Copyright ⌐ 1991, Michael J. Conrad}
  3. {}
  4. {    Handles a bunch of dialog stuff.}
  5.  
  6. UNIT DialogUtils;
  7.  
  8. INTERFACE
  9.  
  10.     USES
  11.         CList;
  12.  
  13.     TYPE
  14.         dialogItemRec = RECORD
  15.                 hasText: Boolean;
  16.                 hasList: Boolean;
  17.             END;
  18.  
  19.     CONST
  20.         textMargin = 2;
  21.  
  22.     VAR
  23.         dialogTE: TEHandle;            { Handle for the scrolling text (if any) }
  24.         dialogTERect: Rect;            { Rect for the scrolling text }
  25.         dialogList: CList;                { The dialog's list (if any) }
  26.         dialogItems: dialogItemRec;
  27.         dialogScrollBar: ControlHandle;
  28.         dialogDoubleClick: Boolean;
  29.  
  30.         screenBounds: Rect;
  31.  
  32. {Dialog utilities}
  33.     FUNCTION GetDCValue (d: DialogPtr;
  34.                                     item: integer): integer;
  35.     PROCEDURE SetDCtl (d: DialogPtr;
  36.                                     item: integer;
  37.                                     value: integer);
  38.     PROCEDURE HiliteDItem (d: DialogPtr;
  39.                                     item: integer;
  40.                                     value: integer);
  41.     PROCEDURE SetDlgText (d: DialogPtr;
  42.                                     item: integer;
  43.                                     theText: Str255);
  44.     FUNCTION GetDlgText (d: DialogPtr;
  45.                                     item: integer): Str255;
  46.     PROCEDURE ToggleCtl (d: DialogPtr;
  47.                                     item: integer);
  48.     PROCEDURE CenterDialog (d: DialogPtr;
  49.                                     id: integer;
  50.                                     horz, vert: Boolean);
  51.     FUNCTION CenterNewDialog (id: integer;
  52.                                     dStorage: Ptr;
  53.                                     inFrontOf: WindowPtr;
  54.                                     font, size: integer): DialogPtr;
  55.     FUNCTION DlgFilter (d: DialogPtr;
  56.                                     VAR e: EventRecord;
  57.                                     VAR itemHit: integer): Boolean;
  58.     FUNCTION TestDlgCtl (d: DialogPtr;
  59.                                     i: integer): Boolean;
  60.     PROCEDURE SetUpUserItem (d: DialogPtr;
  61.                                     i: integer;
  62.                                     userProc: ProcPtr);
  63.     PROCEDURE FrameDItem (d: DialogPtr;
  64.                                     i: integer);
  65.     FUNCTION GetDlgRect (id: integer): Rect;
  66.     FUNCTION GetItemRect (d: DialogPtr;
  67.                                     item: integer): Rect;
  68.     FUNCTION GetCtrlHndl (d: DialogPtr;
  69.                                     item: integer): ControlHandle;
  70.     PROCEDURE DlgUpdate (d: DialogPtr);
  71.     PROCEDURE FlashDItem (dp: DialogPtr;
  72.                                     item: integer);
  73.  
  74. {Special scrolling text dialog}
  75.     PROCEDURE InitScrollingDialog (d: DialogPtr;
  76.                                     uItem: integer;
  77.                                     textID: integer);
  78.     PROCEDURE DisposeScrollingDialog (d: DialogPtr);
  79.     PROCEDURE SetDialogText (textID: integer);
  80.  
  81. {Special list dialog}
  82.     PROCEDURE InitDialogList (dList: CList);
  83.  
  84. {Alert Utilities}
  85.     FUNCTION CenterAlert (id: integer;
  86.                                     filterProc: ProcPtr): integer;
  87.  
  88.     PROCEDURE InitDialogUtils;
  89.  
  90. IMPLEMENTATION
  91.  
  92.     PROCEDURE DlgNullEvt (d: DialogPtr;
  93.                                     e: EventRecord);
  94.     forward;
  95.  
  96. {--------------------------------Ñ--------------------------------}
  97.  
  98.     PROCEDURE InitDialogUtils;
  99.         VAR
  100.             p1, p2: GrafPtr;
  101.  
  102.     BEGIN
  103.         GetPort(p1);
  104.  
  105.         p2 := GrafPtr(NewPtr(sizeof(GrafPort)));
  106.         OpenPort(p2);
  107.         screenBounds := p2^.portBits.bounds;
  108.  
  109.         ClosePort(p2);
  110.         DisposPtr(Pointer(p2));
  111.  
  112.         SetPort(p1);
  113.     END;
  114.  
  115. {--------------------------------Ñ--------------------------------}
  116.  
  117.     FUNCTION GetMBarHeight: integer;
  118.     INLINE
  119.         $3EB8, $0BAA;
  120.  
  121. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  122. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ Dialog List Routines ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  123. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  124.  
  125. { The List object must be passed to this routine! }
  126.     PROCEDURE InitDialogList (dList: CList);
  127.     BEGIN
  128.         IF dList <> NIL THEN
  129.             dialogList := dList;
  130.         dialogItems.hasList := True;
  131.     END;
  132.  
  133. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  134. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ Scrolling Dialog Routines ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  135. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  136.  
  137.     PROCEDURE AdjustText (theScrollBar: ControlHandle);
  138.         VAR
  139.             oldScroll: integer;
  140.             newScroll: integer;
  141.  
  142.     BEGIN
  143.         HLock(Handle(dialogTE));
  144.  
  145.         WITH dialogTE^^ DO
  146.             BEGIN
  147.                 oldScroll := viewRect.top - destRect.top;
  148.                 newScroll := GetCtlValue(theScrollBar) * lineHeight;
  149.  
  150.                 TEScroll(0, oldScroll - newScroll, dialogTE);
  151.             END;
  152.         HUnLock(Handle(dialogTE));
  153.     END;
  154.  
  155. {--------------------------------Ñ--------------------------------}
  156.  
  157.     PROCEDURE ScrlText (theScrollBar: ControlHandle;
  158.                                     thePart: integer);
  159.         VAR
  160.             delta: integer;
  161.             oldValue: integer;
  162.             moveMent: integer;
  163.  
  164.     BEGIN
  165.         CASE thePart OF
  166.             inUpButton: 
  167.                 delta := -1;
  168.             inDownButton: 
  169.                 delta := +1;
  170.             inPageUp: 
  171.                 WITH dialogTE^^, viewRect DO
  172.                     delta := (top - bottom) DIV lineHeight + 1;
  173.             inPageDown: 
  174.                 WITH dialogTE^^, viewRect DO
  175.                     delta := (bottom - top) DIV lineHeight - 1;
  176.             OTHERWISE
  177.                 ;
  178.         END;
  179.  
  180.         IF (thePart <> 0) THEN
  181.             BEGIN
  182.                 oldValue := GetCtlValue(theScrollBar);
  183.                 moveMent := oldValue + delta;
  184.                 IF moveMent > GetCtlMax(theScrollBar) THEN
  185.                     moveMent := GetCtlMax(theScrollBar);
  186.                 IF moveMent < GetCtlMin(theScrollBar) THEN
  187.                     moveMent := GetCtlMin(theScrollBar);
  188.  
  189.                 SetCtlValue(theScrollBar, moveMent);
  190.  
  191.                 AdjustText(theScrollBar);
  192.             END;
  193.     END;
  194.  
  195. {--------------------------------Ñ--------------------------------}
  196.  
  197.     PROCEDURE SetScrollBar (theScrollBar: ControlHandle);
  198.         VAR
  199.             windowHeight, maxTop: integer;
  200.  
  201.     BEGIN
  202.         WITH dialogTE^^, viewRect DO
  203.             BEGIN
  204.                 windowHeight := (bottom - top) DIV lineHeight;
  205.                 maxTop := nLines - windowHeight;
  206.             END;
  207.  
  208.         IF (maxTop <= 0) THEN
  209.             BEGIN
  210.                 maxTop := 0;
  211.                 HiliteControl(theScrollBar, 255);
  212.             END
  213.         ELSE
  214.             HiliteControl(theScrollBar, 0);
  215.  
  216.         SetCtlMin(theScrollBar, 0);
  217.         SetCtlMax(theScrollBar, maxTop);
  218.     END;
  219.  
  220. {--------------------------------Ñ--------------------------------}
  221.  
  222.     PROCEDURE SetDialogText (textID: integer);
  223.         VAR
  224.             h: Handle;
  225.  
  226.     BEGIN
  227.         IF dialogItems.hasText THEN
  228.             BEGIN
  229.                 IF dialogTE <> NIL THEN
  230.                     BEGIN
  231.                         h := Get1Resource('TEXT', textID);
  232.                         IF h <> NIL THEN
  233.                             BEGIN
  234.                                 TESetText(h^, GetHandleSize(h), dialogTE);
  235.                                 TECalText(dialogTE);
  236.                                 EraseRect(dialogTE^^.viewRect);
  237.                                 InvalRect(dialogTE^^.viewRect);
  238.                                 SetCtlValue(dialogScrollBar, 0);
  239.                                 SetScrollBar(dialogScrollBar);
  240.                                 AdjustText(dialogScrollBar);
  241.                             END;
  242.                     END;
  243.             END;
  244.     END;
  245.  
  246. {--------------------------------Ñ--------------------------------}
  247.  
  248.     PROCEDURE InitScrollingDialog (d: DialogPtr;
  249.                                     uItem: integer;
  250.                                     textID: integer);
  251.         VAR
  252.             textRect: Rect;
  253.             scrollItem: integer;
  254.  
  255.     BEGIN
  256.         scrollItem := uItem + 1;
  257.         dialogTERect := GetItemRect(d, uItem);
  258.         textRect := dialogTERect;
  259.  
  260.         dialogItems.hasText := True;
  261.  
  262.         InsetRect(textRect, textMargin, textMargin);
  263.         dialogTE := TENew(textRect, textRect);
  264.         dialogScrollBar := GetCtrlHndl(d, scrollItem);
  265.         SetDialogText(textID);
  266.         TEActivate(dialogTE);
  267.     END;
  268.  
  269. {--------------------------------Ñ--------------------------------}
  270.  
  271.     PROCEDURE DisposeScrollingDialog (d: DialogPtr);
  272.     BEGIN
  273.         TEDispose(dialogTE);
  274.         dialogItems.hasText := False;
  275.         DisposDialog(d);
  276.     END;
  277.  
  278.  
  279. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  280. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ Standard Dialog Routines ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  281. {ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ    }
  282.  
  283.     FUNCTION GetCtrlHndl (d: DialogPtr;
  284.                                     item: integer): ControlHandle;
  285.         VAR
  286.             itype: integer;
  287.             irect: Rect;
  288.             ihan: Handle;
  289.  
  290.     BEGIN
  291.         GetDItem(d, item, itype, ihan, irect);
  292.         GetCtrlHndl := ControlHandle(ihan);
  293.     END;
  294.  
  295. {--------------------------------Ñ--------------------------------}
  296.  
  297.     FUNCTION GetItemRect (d: DialogPtr;
  298.                                     item: integer): Rect;
  299.         VAR
  300.             itype: integer;
  301.             irect: Rect;
  302.             ihan: Handle;
  303.  
  304.     BEGIN
  305.         GetDItem(d, item, itype, ihan, irect);
  306.         GetItemRect := irect;
  307.     END;
  308.  
  309. {--------------------------------Ñ--------------------------------}
  310.  
  311.     PROCEDURE ToggleCtl (d: DialogPtr;
  312.                                     item: integer);
  313.     BEGIN
  314.         SetDCtl(d, item, ORD(GetDCValue(d, item) = 0));
  315.     END;
  316.  
  317. {--------------------------------Ñ--------------------------------}
  318.  
  319.     FUNCTION GetDlgText (d: DialogPtr;
  320.                                     item: integer): Str255;
  321.         VAR
  322.             itype: integer;
  323.             ihan: handle;
  324.             irect: Rect;
  325.  
  326.     BEGIN
  327.         GetDlgText := '';
  328.         GetDItem(d, item, itype, ihan, irect);
  329.         IF (itype = editText) OR (itype = editText + itemDisable) THEN
  330.             GetIText(ihan, GetDlgText);
  331.     END;
  332.  
  333. {--------------------------------Ñ--------------------------------}
  334.  
  335.     PROCEDURE SetDlgText (d: DialogPtr;
  336.                                     item: integer;
  337.                                     theText: Str255);
  338.         VAR
  339.             itype: integer;
  340.             ihan: handle;
  341.             irect: Rect;
  342.  
  343.     BEGIN
  344.         GetDItem(d, item, itype, ihan, irect);
  345.         IF (itype = editText) OR (itype = editText + itemDisable) OR (itype = statText) OR (itype = statText + itemDisable) THEN
  346.             SetIText(ihan, theText);
  347.     END;
  348.  
  349. {--------------------------------Ñ--------------------------------}
  350.  
  351.     PROCEDURE HiliteDItem (d: DialogPtr;
  352.                                     item: integer;
  353.                                     value: integer);
  354.         VAR
  355.             itype: integer;
  356.             ihan: handle;
  357.             irect: Rect;
  358.  
  359.     BEGIN
  360.         GetDItem(d, item, itype, ihan, irect);
  361.         IF (itype = ctrlItem + chkCtrl) OR (itype = ctrlItem + radCtrl) OR (itype = ctrlItem + btnCtrl) THEN
  362.             HiliteControl(ControlHandle(ihan), value);
  363.     END;
  364.  
  365. {--------------------------------Ñ--------------------------------}
  366.  
  367.     FUNCTION GetDCValue (d: DialogPtr;
  368.                                     item: integer): integer;
  369.         VAR
  370.             itype: integer;
  371.             ihan: handle;
  372.             irect: Rect;
  373.  
  374.     BEGIN
  375.         GetDCValue := 0;
  376.         GetDItem(d, item, itype, ihan, irect);
  377.         IF (itype = ctrlItem + chkCtrl) OR (itype = ctrlItem + radCtrl) THEN
  378.             GetDCValue := GetCtlValue(ControlHandle(ihan));
  379.     END;
  380.  
  381. {--------------------------------Ñ--------------------------------}
  382.  
  383.     PROCEDURE SetDCtl (d: DialogPtr;
  384.                                     item: integer;
  385.                                     value: integer);
  386.         VAR
  387.             itype: integer;
  388.             ihan: handle;
  389.             irect: Rect;
  390.  
  391.     BEGIN
  392.         GetDItem(d, item, itype, ihan, irect);
  393.         IF (itype = ctrlItem + chkCtrl) OR (itype = ctrlItem + radCtrl) THEN
  394.             SetCtlValue(ControlHandle(ihan), value);
  395.     END;
  396.  
  397. {--------------------------------Ñ--------------------------------}
  398.  
  399.     PROCEDURE PositionDialog (theType: ResType;
  400.                                     theID: integer);
  401.         VAR
  402.             r: Rect;
  403.             aRectPtr: RectPtr;
  404.             dlgTemplate: Handle;
  405.             left, top: integer;
  406.  
  407.     BEGIN
  408.         dlgTemplate := GetResource(theType, theID);
  409.         aRectPtr := RectPtr(dlgTemplate^);
  410.         r := aRectPtr^;
  411.  
  412.         left := (screenBounds.right - (r.right - r.left)) DIV 2;
  413.         top := (screenBounds.bottom - (r.bottom - r.top)) DIV 3;
  414.  
  415.         IF top < GetMBarHeight + 7 THEN
  416.             top := GetMBarHeight + 7;
  417.  
  418.         r.right := r.right + left - r.left;
  419.         r.left := left;
  420.         r.bottom := r.bottom + top - r.top;
  421.         r.top := top;
  422.  
  423.         aRectPtr^ := r;
  424.     END;
  425.  
  426. {--------------------------------Ñ--------------------------------}
  427.  
  428.     FUNCTION CenterNewDialog (id: integer;
  429.                                     dStorage: Ptr;
  430.                                     inFrontOf: WindowPtr;
  431.                                     font, size: integer): DialogPtr;
  432.         VAR
  433.             newDlg: DialogPtr;
  434.  
  435.     BEGIN
  436.         PositionDialog('DLOG', id);
  437.         newDlg := GetNewDialog(id, dStorage, inFrontOf);
  438.         SetPort(newDlg);
  439.  
  440.         TextFont(font);
  441.         TextSize(size);
  442.  
  443.         ShowWindow(newDlg);
  444.  
  445.         dialogItems.hasText := False;
  446.         dialogItems.hasList := False;
  447.  
  448.         CenterNewDialog := newDlg;
  449.     END;
  450.  
  451. {--------------------------------Ñ--------------------------------}
  452.  
  453.     PROCEDURE DlgNullEvt (d: DialogPtr;
  454.                                     e: EventRecord);
  455.         VAR
  456.             savePort: GrafPtr;
  457.             mLoc: Point;
  458.             i, itype: integer;
  459.             ihan: Handle;
  460.             irect: Rect;
  461.             iCurs: CursHandle;
  462.  
  463.     BEGIN
  464.         GetPort(savePort);
  465.         SetPort(d);
  466.         mLoc := e.where;
  467.         GlobalToLocal(mLoc);
  468.  
  469.         i := FindDItem(d, mLoc) + 1;
  470.  
  471.         IF (i >= 1) THEN
  472.             BEGIN
  473.                 GetDItem(d, i, itype, ihan, irect);
  474.                 IF (itype = editText) THEN
  475.                     BEGIN
  476.                         iCurs := GetCursor(iBeamCursor);
  477.                         SetCursor(iCurs^^);
  478.                     END
  479.                 ELSE
  480.                     InitCursor;
  481.             END
  482.         ELSE
  483.             InitCursor;
  484.  
  485.         SetPort(savePort);
  486.     END;
  487.  
  488. {--------------------------------Ñ--------------------------------}
  489.  
  490.     PROCEDURE DlgUpdate (d: DialogPtr);
  491.         VAR
  492.             savePort: GrafPtr;
  493.             irect, r: Rect;
  494.  
  495.     BEGIN
  496.         GetPort(savePort);
  497.         SetPort(d);
  498.  
  499.         BeginUpdate(d);
  500.  
  501.         irect := GetItemRect(d, DialogPeek(d)^.aDefItem);
  502.         PenSize(3, 3);
  503.         InsetRect(irect, -4, -4);
  504.         FrameRoundRect(irect, 16, 16);
  505.         PenSize(1, 1);
  506.  
  507.         IF dialogItems.hasText THEN
  508.             BEGIN
  509.                 r := dialogTERect;
  510.                 InsetRect(r, textMargin, textMargin);
  511.                 TEUpdate(r, dialogTE);
  512.                 FrameRect(dialogTERect);
  513.             END;
  514.  
  515.         IF dialogItems.hasList THEN
  516.             dialogList.ListUpdate;
  517.  
  518.         DrawDialog(d);
  519.         EndUpdate(d);
  520.  
  521.         SetPort(savePort);
  522.     END;
  523.  
  524. {--------------------------------Ñ--------------------------------}
  525.  
  526.     PROCEDURE FlashDItem (dp: DialogPtr;
  527.                                     item: integer);
  528.         VAR
  529.             tickScratch: longint;
  530.             itype: integer;
  531.             ihan: Handle;
  532.             irect: Rect;
  533.  
  534.     BEGIN
  535.         GetDItem(dp, item, itype, ihan, irect);
  536.         HiliteControl(ControlHandle(ihan), 1);
  537.         Delay(10, tickScratch);
  538.         HiliteControl(ControlHandle(ihan), 0);
  539.     END;
  540.  
  541. {--------------------------------Ñ--------------------------------}
  542.  
  543.     FUNCTION DlgFilter (d: DialogPtr;
  544.                                     VAR e: EventRecord;
  545.                                     VAR itemHit: integer): Boolean;
  546.         VAR
  547.             chCode: integer;
  548.             thePart, temp: integer;
  549.             pt: Point;
  550.             theControl: ControlHandle;
  551.  
  552.     BEGIN
  553.         SetUpA4;
  554.  
  555.         DlgFilter := False;
  556.  
  557.         CASE e.what OF
  558.             nullEvent: 
  559.                 DlgNullEvt(d, e);
  560.  
  561.             activateEvt: 
  562.                 BEGIN
  563.                 END;
  564.  
  565.             updateEvt: 
  566.                 BEGIN
  567.                     IF (DialogPtr(e.message) = d) THEN
  568.                         DlgUpdate(d);
  569.                 END;
  570.  
  571.             mouseDown: 
  572.                 BEGIN
  573.                     pt := e.where;
  574.                     GlobalToLocal(pt);
  575.                     IF dialogItems.hasText THEN
  576.                         BEGIN
  577.                             pt := e.where;
  578.                             GlobalToLocal(pt);
  579.                             thePart := FindControl(pt, d, theControl);
  580.                             IF theControl = dialogScrollBar THEN
  581.                                 IF (thePart = inThumb) THEN
  582.                                     BEGIN
  583.                                         temp := TrackControl(theControl, pt, NIL);
  584.                                         AdjustText(theControl);
  585.                                         DlgFilter := True;
  586.                                     END
  587.                                 ELSE IF (thePart >= inUpButton) THEN
  588.                                     BEGIN
  589.                                         temp := TrackControl(theControl, pt, @scrlText);
  590.                                         DlgFilter := True;
  591.                                     END;
  592.                         END;
  593.                     IF dialogItems.hasList THEN
  594.                         BEGIN
  595.                             IF PtInRect(pt, dialogList.listRect) THEN
  596.                                 BEGIN
  597.                                     GlobalToLocal(e.where);
  598.                                     dialogDoubleClick := dialogList.DoList(e);
  599.                                     DlgFilter := True;
  600.                                     LocalToGlobal(e.where);
  601.                                 END;
  602.                         END;
  603.                 END;
  604.  
  605.             keyDown: 
  606.                 BEGIN
  607.                     chCode := BitAnd(e.message, charCodeMask);
  608.                     IF (chCode = 13) OR (chCode = 3) AND (TestDlgCtl(d, 1)) THEN
  609.                         BEGIN
  610.                             itemHit := 1;
  611.                             FlashDItem(d, itemHit);
  612.                             DlgFilter := True;
  613.                         END
  614.                     ELSE IF (chCode = 27) AND (TestDlgCtl(d, 2)) THEN
  615.                         BEGIN
  616.                             itemHit := 2;
  617.                             FlashDItem(d, itemHit);
  618.                             DlgFilter := True;
  619.                         END;
  620.                 END;
  621.  
  622.             OTHERWISE
  623.                 ;
  624.         END;
  625.  
  626.         RestoreA4;
  627.     END;
  628.  
  629. {--------------------------------Ñ--------------------------------}
  630.  
  631.     FUNCTION CenterAlert (id: integer;
  632.                                     filterProc: ProcPtr): integer;
  633.         VAR
  634.             theAlert: AlertTHndl;
  635.             width, height: integer;
  636.  
  637.     BEGIN
  638.         PositionDialog('ALRT', id);
  639.         CenterAlert := Alert(id, filterProc);
  640.  
  641.         FreeAlert(id);
  642.     END;
  643.  
  644. {--------------------------------Ñ--------------------------------}
  645.  
  646.     FUNCTION TestDlgCtl (d: DialogPtr;
  647.                                     i: integer): Boolean;
  648.         VAR
  649.             itype: integer;
  650.             ihan: Handle;
  651.             irect: Rect;
  652.  
  653.     BEGIN
  654.         GetDItem(d, i, itype, ihan, irect);
  655.         IF (itype = ctrlItem + btnCtrl) OR (itype = ctrlItem + chkCtrl) OR (itype = ctrlItem + radCtrl) THEN
  656.             TestDlgCtl := ControlHandle(ihan)^^.contrlHilite <> $FF;
  657.     END;
  658.  
  659. {--------------------------------Ñ--------------------------------}
  660.  
  661.     PROCEDURE SetUpUserItem (d: DialogPtr;
  662.                                     i: integer;
  663.                                     userProc: ProcPtr);
  664.         VAR
  665.             itype: integer;
  666.             ihan: Handle;
  667.             irect: Rect;
  668.  
  669.     BEGIN
  670.         GetDItem(d, i, itype, ihan, irect);
  671.         SetDItem(d, i, itype, Handle(userProc), irect);
  672.     END;
  673.  
  674. {--------------------------------Ñ--------------------------------}
  675.  
  676.     PROCEDURE FrameDItem (d: DialogPtr;
  677.                                     i: integer);
  678.         VAR
  679.             savePort: GrafPtr;
  680.             itype: integer;
  681.             ihan: Handle;
  682.             irect: Rect;
  683.             gray: Pattern;
  684.  
  685.     BEGIN
  686.         GetPort(savePort);
  687.         SetPort(d);
  688.  
  689.         GetDItem(d, i, itype, ihan, irect);
  690.         WITH irect DO
  691.             IF (bottom - top <= 1) OR (right - left <= 1) THEN
  692.                 BEGIN
  693.                     GetIndPattern(gray, SysPatListId, 5);
  694.                     PenPat(gray);
  695.                 END;
  696.  
  697.         FrameRect(irect);
  698.         PenNormal;
  699.  
  700.         SetPort(savePort);
  701.     END;
  702.  
  703. {--------------------------------Ñ--------------------------------}
  704.  
  705.     FUNCTION GetDlgRect (id: integer): Rect;
  706.         VAR
  707.             dTh: DialogTHndl;
  708.  
  709.     BEGIN
  710.         dTH := DialogTHndl(GetResource('DLOG', id));
  711.         IF (dTH = NIL) THEN
  712.             Exit(GetDlgRect);
  713.  
  714.         GetDlgRect := dTH^^.boundsRect;
  715.     END;
  716.  
  717. {--------------------------------Ñ--------------------------------}
  718.  
  719. END.